﻿#ifndef DELAYCAMERDEVICE_H
#define DELAYCAMERDEVICE_H
// 只包含基本的Windows头文件以支持CRITICAL_SECTION
#include <Windows.h>
#include <string>
#ifdef DELAYCAMERDEVICE_EXPORTS
#define DELAYCAMERDEVICE_API __declspec(dllexport)
#else
#define DELAYCAMERDEVICE_API __declspec(dllimport)
#endif

#include "DelayDefine.h"

/**
 * @class DelayCamerDevice
 * @brief 延时设备控制类，封装了对DelayDevice的操作，提供无MFC依赖的接口
 * @details 该类采用单例模式设计，提供了设备连接、参数设置、状态查询等功能
 */
class DELAYCAMERDEVICE_API DelayCamerDevice
{
public:
	/**
	 * @brief 设置设备连接回调函数
	 * @param devConnFunc 设备连接回调函数指针
	 */
	void SetDevConnCallback(FunBakDevConn devConnFunc);
	
	/**
	 * @brief 设置设备状态回调函数
	 * @param devStsFunc 设备状态回调函数指针
	 */
	void SetDevStsCallback(FunBakDevSts devStsFunc);
	
	/**
	 * @brief 设置校正状态回调函数
	 * @param corrStsFunc 校正状态回调函数指针
	 */
	void SetCorrStsCallback(FunBakCorrSts corrStsFunc);
	
	/**
	 * @brief 设置Flash状态回调函数
	 * @param flashStsFunc Flash状态回调函数指针
	 */
	void SetFlashStsCallback(FunBakFlashSts flashStsFunc);
	
	/**
	 * @brief 设置AD/IO回调函数
	 * @param adIoFunc AD/IO回调函数指针
	 */
	void SetAdIoCallback(FunBakADIO adIoFunc);
	
	/**
	 * @brief 设置IP状态回调函数
	 * @param setIPStsFunc IP状态回调函数指针
	 */
	void SetIPStsCallback(FunBakSetIPSts setIPStsFunc);
	
	/**
	 * @brief 设置命令同步回调函数
	 * @param cmdSameFunc 命令同步回调函数指针
	 */
	void SetCmdSameCallback(FunBakCmdSame cmdSameFunc);
	
	/**
	 * @brief 获取设备IP信息（字符串格式）
	 * @param ip 输出参数，设备IP地址
	 * @param mask 输出参数，子网掩码
	 * @param gate 输出参数，网关地址
	 * @param port 输出参数，端口号
	 */
	void GetIpInfo(std::string& ip, std::string& mask, std::string& gate, int& port);
	
	/**
	 * @brief 设置设备IP信息（字符串格式）
	 * @param ip 设备IP地址
	 * @param mask 子网掩码
	 * @param gate 网关地址
	 * @param port 端口号
	 */
	void SetIpInfo(const std::string& ip, const std::string& mask, const std::string& gate, int port);
	
	/**
	 * @brief 获取设备IP信息（整数格式）
	 * @param ip 输出参数，设备IP地址（数组形式，4个整数）
	 * @param mask 输出参数，子网掩码（数组形式，4个整数）
	 * @param gate 输出参数，网关地址（数组形式，4个整数）
	 * @param port 输出参数，端口号
	 */
	void GetIpInfo2(int* ip, int* mask, int* gate, int& port);
	
	/**
	 * @brief 设置设备IP信息（整数格式）
	 * @param ip 设备IP地址（数组形式，4个整数）
	 * @param mask 子网掩码（数组形式，4个整数）
	 * @param gate 网关地址（数组形式，4个整数）
	 * @param port 端口号
	 */
	void SetIpInfo2(int* ip, int* mask, int* gate, int port);
	
	/**
	 * @brief 检查TCP连接状态
	 * @return TCP连接已打开返回true，否则返回false
	 */
	bool IsOpenTcp();
	
	/**
	 * @brief 打开TCP连接
	 * @return 成功返回0，失败返回错误码
	 */
	int OpenTcp();
	
	/**
	 * @brief 关闭TCP连接
	 * @return 成功返回0，失败返回错误码
	 */
	int CloseTcp();
	
	/**
	 * @brief 获取设备状态
	 * @return 成功返回0，失败返回错误码
	 */
	int GetDevSts();
	
	/**
	 * @brief 设置校正参数
	 * @return 成功返回0，失败返回错误码
	 */
	int SetCorrect();

	/**
	 * @brief 获取上传信息
	 * @param time 是否带时间戳
	 * @return 成功返回0，失败返回错误码
	 */
	int GetUpInfo(bool time);
	
	/**
	 * @brief 设置Flash参数
	 * @param inst Flash参数结构体指针
	 * @return 成功返回0，失败返回错误码
	 */
	int SetFlash(str_Flash* inst);
	
	/**
	 * @brief 设置延时参数
	 * @param inst 延时参数结构体指针
	 * @return 成功返回0，失败返回错误码
	 */
	int SetArgs(str_Args* inst);
	
	/**
	 * @brief 设置设备IP
	 * @param inst IP参数结构体指针
	 * @return 成功返回0，失败返回错误码
	 */
	int SetIP(str_IP* inst);
	
	/**
	 * @brief 获取类的单例实例
	 * @return DelayCamerDevice类的单例指针
	 */
	static DelayCamerDevice* GetInstance();

private:
	/**
	 * @brief 私有构造函数，防止外部实例化
	 */
	DelayCamerDevice();
	
	/**
	 * @brief 析构函数
	 */
	~DelayCamerDevice();
	
	/**
	 * @brief 禁用拷贝构造函数
	 */
	DelayCamerDevice(const DelayCamerDevice&);
	
	/**
	 * @brief 禁用赋值运算符
	 */
	DelayCamerDevice& operator=(const DelayCamerDevice&);
	
private:
	static DelayCamerDevice* m_instance;      ///< 单例实例指针
	static CRITICAL_SECTION m_cs;             ///< 临界区，用于线程安全
};

#endif